package com.study.aop.theory.proxy;

import sun.misc.ProxyGenerator;

import java.io.FileOutputStream;
import java.io.IOException;

/**
 * jdk动态代理原理
 *
 * 字节码文件
 * 一个放有二进制字节码的class文件\^-^| \^-^| \^-^|
 *
 * @author: chenhs
 * @date: Created in 8:39 2020/2/6
 **/
public class ProxyUtils {

    /**
     * 将根据类信息 动态生成的二进制字节码保存到硬盘中，默认的是clazz目录下params
     *
     * @param clazz     需要生成动态代理类的类
     * @param proxyName 为动态生成的代理类的名称
     */
    public static void generateClassFile(Class clazz, String proxyName) {
        //generate是个native方法
        byte[] classFile = ProxyGenerator.generateProxyClass(proxyName, new Class[]{clazz});

        String paths = clazz.getResource(".").getPath();
        System.out.println(paths);
        FileOutputStream out = null;

        try {
            out = new FileOutputStream(paths + proxyName + ".class");
            out.write(classFile);
            out.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 测试一下
     *
     * @param args
     */
    public static void main(String[] args) {
        generateClassFile(StaticProxy.class, "staticProxy$Proxy123");
    }
}
